package algoritmos;

import java.util.ArrayList;

import Jama.Matrix;

public class Matriz extends Matrix{

	/**
	 * 
	 */
	private static final long serialVersionUID = 3447958524636202774L;
	
	public Matriz(int arg0, int arg1) {
		super(arg0, arg1);
	}
	
	public Matriz(Matrix arg0){
		super(arg0.getRowDimension(), arg0.getColumnDimension());
		for (int i = 0; i < this.getRowDimension(); i++){
			for (int j = 0; j < this.getColumnDimension(); j++){
				this.set(i, j, arg0.get(i, j));
			}				
		}
	}
	
	public Matriz(ArrayList<Number> lista){
		super(1, lista.size());
		for (int i = 0; i < this.getColumnDimension(); i++){
			this.set(0, i, (Double) lista.get(i).doubleValue());				
		}
	}
	
	public Matriz clone(){
		Matriz temp = new Matriz(this.getRowDimension(), this.getColumnDimension());
		for (int i = 0; i < this.getRowDimension(); i++){
			for (int j = 0; j < this.getColumnDimension(); j++){
				temp.set(i, j, this.get(i, j));
			}				
		}
		return temp;
	}
	
	public Matriz divide(double arg0){
		if (arg0 == 0) Error.emiteError("Se ha intentado una división por 0");
		Matriz temp = new Matriz(this.getRowDimension(), this.getColumnDimension());
		for (int i = 0; i < this.getRowDimension(); i++){
			for (int j = 0; j < this.getColumnDimension(); j++){
				temp.set(i, j, this.get(i, j) / arg0);
			}				
		}
		return temp;
	}
	
	public double distancia(Matriz arg0){
		double distancia = 0;
		for (int i = 0; i < this.getColumnDimension(); i++){
			distancia += Math.pow(this.get( 0, i) - arg0.get( 0, i), 2);
		}
		return distancia;
	}
	
	public double distanciaMahalanobis(Matriz centro, Matriz covarianza){
		double temp = 0;
		Matriz tempMatriz1 = new Matriz(this.minus(centro));
		Matriz tempMatriz2 = new Matriz(covarianza.inverse());
		Matriz tempMatriz3 = new Matriz(this.minus(centro).transpose());
		tempMatriz1 = new Matriz(tempMatriz1.times(tempMatriz2));
		tempMatriz1 = new Matriz(tempMatriz1.times(tempMatriz3));
		temp = tempMatriz1.get(0,0);
		return temp;
	}
	
	public String toString(){
		String temp = new String();
		for (int i = 0; i < this.getRowDimension(); i++){
			temp += "[" + this.get(i,0);
			for (int j = 1; j < this.getColumnDimension(); j++){
				temp += "," + this.get(i,j);
			}
			temp += "] ";
		}
		return temp;
	}

}
